/*
 * CMap.cpp
 *
 *  Created on: 28/08/2008
 *      Author: samuel.grigolato
 */

#include "CMap.h"

#include <string>

CMap::CMap() {
	SurfTileset = NULL;
	SurfBackground = NULL;
	Altura = 0;
	Largura = 0;
	MaxPlayers = 0;
}

CMap::~CMap() {
}

bool CMap::OnLoad(std::string File) {
	TileList.clear();

	FILE* FileHandle = fopen(File.data(), "r");

	if (FileHandle == NULL) {
		return false;
	}

	fscanf(FileHandle, "%d %d %d", &Altura, &Largura, &MaxPlayers);
	fscanf(FileHandle, "\n");
	fscanf(FileHandle, "\n");

	CParametros::SetAlturaMapa(Altura);
	CParametros::SetLarguraMapa(Largura);

	for (int y = 0; y < Altura; y++) {
		for (int x = 0; x < Largura; x++) {
			CTile TempTile;

			fscanf(FileHandle, "%d ", &TempTile.TileID);

			TileList.push_back(TempTile);
		}
		fscanf(FileHandle, "\n");
	}

	fscanf(FileHandle, "\n");
	CriaObjetosImoveis(FileHandle);
	fscanf(FileHandle, "\n");
	CriaObjetos(FileHandle);
	fclose(FileHandle);

	return true;
}

void CMap::OnRender(SDL_Surface* SurfDisplay) {
	int LarguraTela = CParametros::GetLarguraJanela();
	int AlturaTela = CParametros::GetAlturaJanela();
	int LarguraTile = CParametros::GetLarguraTile();
	int AlturaTile = CParametros::GetAlturaTile();

	if (SurfTileset == NULL)
		return;

	int MapX = (LarguraTela - (LarguraTile * Largura)) / 2;
	int MapY = (AlturaTela - (AlturaTile * Altura)) / 2;

	CSurface::OnDraw(SurfDisplay, SurfBackground, 0, 0);

	int ID = 0;

	for (int y = 0; y < Altura; y++) {
		for (int x = 0; x < Largura; x++) {

			int tX = MapX + (x * LarguraTile);
			int tY = MapY + (y * AlturaTile);

			int TilesetX = TileList[ID].TileID * LarguraTile;
			int TilesetY = 0;

			CSurface::OnDraw(SurfDisplay, SurfTileset, tX, tY, TilesetX,
					TilesetY, LarguraTile, AlturaTile);

			ID++;
		}
	}
}

void CMap::Init(char *mapa) {

	std::string Background;
	Background += "maps/";
	Background += mapa;
	Background += "/background.png";
	SurfBackground = CSurface::OnLoad(Background);

	std::string Campos;
	Campos += "maps/";
	Campos += mapa;
	Campos += "/campos.png";
	SurfTileset = CSurface::OnLoad(Campos);

	std::string Definicao;
	Definicao += "maps/";
	Definicao += mapa;
	Definicao += "/definicao";
	OnLoad(Definicao);
}

void CMap::CriaObjetosImoveis(FILE* FileHandle) {
	for (int x = 0; x < Altura; x++) {
		for (int y = 0; y < Largura; y++) {
			CObjetoImovel* TempObjImovel = new CObjetoImovel();
			int Tipo;
			char StrTipo[5];
			char Imagem[strlen(CParametros::GetMapa()) + 50];

			fscanf(FileHandle, "%d ", &Tipo);

			if (Tipo == 0) continue;

			itoa(Tipo, StrTipo, 10);

			strcpy(Imagem, "maps/");
			strcat(Imagem, CParametros::GetMapa());
			strcat(Imagem, "/parede");
			strcat(Imagem, StrTipo);
			strcat(Imagem, ".png");

			TempObjImovel->Init(y, x, Imagem, 1);

			CEntity::EntityList->push_back(TempObjImovel);
		}
		fscanf(FileHandle, "\n");
	}
}

void CMap::CriaObjetos(FILE* FileHandle) {

	std::vector<CObjeto*> Objetos;

	for (int x = 0; x < Altura; x++) {
		for (int y = 0; y < Largura; y++) {
			CObjeto* TempObj = new CObjeto();
			int Tipo;
			char StrTipo[5];
			char Imagem[strlen(CParametros::GetMapa()) + 50];

			fscanf(FileHandle, "%d ", &Tipo);

			if (Tipo == 0) continue;

			itoa(Tipo, StrTipo, 10);

			strcpy(Imagem, "maps/");
			strcat(Imagem, CParametros::GetMapa());
			strcat(Imagem, "/obstaculo");
			strcat(Imagem, StrTipo);
			strcat(Imagem, ".png");

			TempObj->Init(y, x, Imagem, 3);
			Objetos.push_back(TempObj);
			CEntity::EntityList->push_back(TempObj);
		}
		fscanf(FileHandle, "\n");
	}

	CriaItens(Objetos);
}

void CMap::CriaItens(std::vector<CObjeto*> Objetos) {
	//
}




